package pro.wy.reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

import pro.wy.model.Apple;

public class Reflex {
	public static void main(String[] args)
			throws ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException,
			SecurityException, IllegalArgumentException, InvocationTargetException {
		// 获取反射中的Class对象
		// 第一种，使用 Class.forName 静态方法。当你知道该类的全路径名时，你可以使用该方法获取 Class 类对象
		Class clz = Class.forName("java.lang.String");
		// 第二种，使用 .class 方法，一般在我们知道有这个类的时候去使用
		Class clz2 = String.class;
		// 第三种，使用类对象的 getClass() 方法，前提是对象已经被实例化出来了
		String str = new String("Hello");
		Class clz3 = str.getClass();

		// 通过反射创建类对象
		// 第一种：通过 Class 对象的 newInstance() 方法。
		Class clz4 = Apple.class;
		Apple apple = (Apple) clz4.newInstance();
		// 第二种：通过 Constructor 对象的 newInstance() 方法
		Class clz5 = Apple.class;
		Constructor constructor = clz5.getConstructor();
		Apple apple2 = (Apple) constructor.newInstance();

		// 通过反射获取类属性、方法、构造器
		Class clz6 = Apple.class;
		Field[] fields = clz6.getDeclaredFields();
		for (Field field : fields) {
			System.out.println(field.getName());
		}
	}

}
